import os
import json

from scrapy.utils.serialize import ScrapyJSONEncoder
from w3lib.html import remove_tags, replace_entities


def set_add(s, item):
    if not isinstance(s, set):
        raise TypeError
    l0 = len(s)
    s.add(item)
    l1 = len(s)
    if l1 - l0 == 1:
        return True
    else:
        return False


def jd(obj):
    return json.dumps(obj, ensure_ascii=False, cls=ScrapyJSONEncoder)


class SP:

    @classmethod
    def h_size(cls, file_path):
        size = os.path.getsize(file_path)
        res = cls.size_h(size)
        return res

    @classmethod
    def size_h(cls, size: [int, float], unit=1024):
        if size > unit:
            hs = round(size / (unit), 2)
            if hs > unit:
                hs = round(size / (unit ** 2), 2)
                if hs > unit:
                    hs = round(size / (unit ** 3), 2)
                    if hs > unit:
                        hs = round(size / (unit ** 4), 2)
                        res = f'{hs}TB'
                    else:
                        res = f'{hs}GB'
                else:
                    res = f'{hs}MB'
            else:
                res = f'{hs}KB'
        else:
            if size:
                res = f'{size}B'
            else:
                res = 0
        return res

    @staticmethod
    def mkdir(dirpath):
        if not os.path.exists(dirpath):
            os.makedirs(dirpath)

    @staticmethod
    def shorten_str(s, length):
        if len(s) <= length:
            return s
        else:
            return s[:length] + '...'

    @classmethod
    def shorten_title(cls, title, length=32):
        title_purge = cls.html_purge(title)
        title = cls.shorten_str(title_purge, length=length)
        title = cls.purify_file_name(title)
        return title

    @staticmethod
    def html_purge(html):
        r1 = remove_tags(html)
        r2 = replace_entities(r1)
        return r2

    @staticmethod
    def purify_file_name(file_name):
        forbidden_characters = list('''?'*:"<>\/|''') + ["\n"]
        substitute_characters = list('''？＇❋：＂〈〉↘↙↟''') + ['⏎']
        d = dict(zip(
            forbidden_characters,
            substitute_characters
        ))
        file_name = file_name.strip()
        for k, v in d.items():
            if k in file_name:
                file_name = file_name.replace(k, v)
        return file_name.strip()

    @classmethod
    def purge_string(self, instring):
        """
        去掉数据中的空格换行等字符
        :param instring:
        :return:
        """
        move = dict.fromkeys((ord(c) for c in u"\xa0\n\t|│:：<>？?\\/*’‘“”\"\x01\x02"))
        outstring = instring.translate(move)
        return outstring

    @staticmethod
    def save_text(file=None, text=None, mode='w'):
        file_path = os.path.abspath(file)
        file_dir_path = os.path.dirname(file_path)
        if not os.path.exists(file_dir_path):
            os.makedirs(file_dir_path)
        with open(file, mode=mode, encoding='utf8') as f:
            f.write(text)

    @staticmethod
    def read_file(file):
        with open(file, 'r', encoding='utf-8') as f:
            content = f.read()
            return content

    @staticmethod
    def trans_json_text_to_json(text_file_path):
        with open(text_file_path, 'r', encoding='utf8') as f:
            json_str = f.read()
        json_obj = json.loads(json_str)
        return json_obj

    @staticmethod
    def extract_from_dict(keys=[], data={}):
        '''返回data字典中包含keys字段的部分'''
        new_dict = {}
        for k in keys:
            new_dict[k] = data.get(k)
        return new_dict

    @staticmethod
    def dict_dumps_date_keys(data):
        new_data = {}
        for k, v in data.items():
            if 'datetime' in type(v):
                new_data[k] = str(v)
            else:
                new_data[k] = v

        return new_data


COUNTRY_LIST = ['中国', '美国', '英国', '法国', '俄罗斯联邦', '德国', '意大利', '加拿大', '日本', '安道尔', '阿联酋',
                '阿富汗', '安提瓜和巴布达', '安格拉',
                '阿尔巴尼亚', '亚美尼亚', '荷兰属地', '安哥拉', '阿根廷', '东萨摩亚', '奥地利', '澳大利亚', '阿鲁巴',
                '阿塞拜疆', '波黑', '巴巴多斯', '孟加拉国',
                '比利时', '布基纳法索', '保加利亚', '巴林', '布隆迪', '贝宁', '文莱达鲁萨兰国', '玻利维亚', '巴西',
                '巴哈马', '不丹', '伯兹瓦纳', '白俄罗斯', '伯利兹',
                '科科斯群岛', '中非共和国', '刚果', '瑞士', '象牙海岸', '库克群岛', '智利', '喀麦隆', '哥伦比亚',
                '赤道几内亚', '哥斯达黎加', '古巴', '圣诞岛（英属）',
                '塞浦路斯', '捷克共和国', '吉布提', '丹麦', '多米尼加联邦', '多米尼加共和国', '阿尔及利亚', '厄瓜多尔',
                '爱沙尼亚', '埃及', '西萨摩亚', '西班牙',
                '埃塞俄比亚', '萨尔瓦多', '芬兰', '斐济', '福克兰群岛', '密克罗尼西亚', '法罗群岛', '加蓬',
                '大不列颠联合王国', '格林纳达', '格鲁吉亚', '法属圭亚那', '加纳',
                '直布罗陀', '格陵兰群岛', '冈比亚', '几内亚', '瓜德罗普岛（法属）', '希腊', '危地马拉', '关岛',
                '几内亚比绍', '圭亚那', '洪都拉斯', '克罗蒂亚', '海地',
                '匈牙利', '印度尼西亚', '爱尔兰共和国', '以色列', '印度', '英属印度洋领地', '伊拉克', '伊朗', '冰岛',
                '牙买加', '约旦', '肯尼亚', '吉尔吉斯斯坦',
                '柬埔塞', '基里巴斯', '科摩罗', '北朝鲜', '南朝鲜', '科威特', '开曼群岛（英属）', '哈萨克斯坦',
                '老挝人民共和国', '黎巴嫩', '圣露西亚岛', '列支敦士登',
                '斯里兰卡', '利比里亚', '莱索托', '立陶宛', '卢森堡', '拉脱维亚', '利比亚', '摩洛哥', '摩纳哥',
                '摩尔多瓦', '马达加斯加', '马绍尔群岛', '马里', '缅甸',
                '蒙古', '北马里亚纳群岛', '马提尼克岛（法属）', '毛里塔尼亚', '蒙塞拉特岛', '马尔他', '马尔代夫',
                '马拉维', '墨西哥', '马来西亚', '莫桑比克', '纳米比亚',
                '新喀里多尼亚', '尼日尔', '诺福克岛', '尼日利亚', '尼加拉瓜', '荷兰', '挪威', '尼泊尔', '瑙鲁', '纽埃',
                '新西兰', '阿曼', '巴拿马', '秘鲁',
                '法属玻利尼西亚', '巴布亚新几内亚', '菲律宾', '巴基斯坦', '波兰', '皮特克恩岛', '波多黎各', '葡萄牙',
                '帕劳', '巴拉圭', '卡塔尔', '留尼汪岛（法属）',
                '罗马尼亚', '卢旺达', '沙特阿拉伯', '所罗门群岛', '塞舌尔', '苏旦', '瑞典', '新加坡', '海伦娜',
                '斯洛伐克', '塞拉利昂', '圣马力诺', '塞内加尔', '索马里',
                '苏里南', '叙利亚', '斯威士兰', '乍得', '法属南半球领地', '多哥', '泰国', '塔吉克斯坦', '托克劳群岛',
                '土库曼斯坦', '突尼斯', '汤加', '东帝汶', '土耳其',
                '图瓦鲁', '坦桑尼亚', '乌克兰', '乌干达', '乌拉圭', '梵地冈', '委内瑞拉', '维京群岛', '越南',
                '瓦努阿图', '东萨摩亚', '也门', '南斯拉夫', '南非',
                '赞比亚', '扎伊尔', '津巴布韦']
LANGUAGE_LIST = ['简体中文', '繁体中文', '英语', '俄语', '德语', '法语', '西班牙语', '日语', '意大利语', '葡萄牙语',
                 '南非荷兰语', '阿尔巴尼亚语', '阿姆哈拉语',
                 '阿拉伯语', '亚美尼亚语', '阿塞拜疆语', '巴斯克语', '白俄罗斯语', '孟加拉语', '波斯尼亚语',
                 '保加利亚语', '加泰罗尼亚语', '宿务语', '奇切瓦语', '科西嘉语',
                 '克罗地亚语', '捷克语', '丹麦语', '荷兰语', '世界语', '爱沙尼亚语', '菲律宾语', '芬兰语', '弗里斯兰语',
                 '加利西亚语', '格鲁吉亚语', '希腊语', '古吉拉特语',
                 '海地克里奥尔语', '豪萨语', '夏威夷语', '希伯来语', '印地语', '苗语', '匈牙利语', '冰岛语', '伊博语',
                 '印度尼西亚语', '爱尔兰语', '爪哇语', '卡纳达语',
                 '哈萨克语', '高棉语', '朝鲜语', '库尔德语', '吉尔吉斯语', '老挝语', '拉丁语', '拉脱维亚语', '立陶宛语',
                 '卢森堡语', '马其顿语', '马尔加什语', '马来语',
                 '马拉雅拉姆语', '马耳他语', '毛利语', '马拉语', '蒙语', '缅甸语', '尼泊尔语', '挪威语', '普什图语',
                 '波斯语', '波兰语', '旁遮普语', '罗马尼亚语',
                 '萨摩亚语', '苏格兰盖尔语', '塞尔维亚语', '塞索托语', '绍纳语', '信德语', '僧伽罗语', '斯洛伐克语',
                 '斯洛文尼亚语', '索马里语', '巽他语', '斯瓦希里语',
                 '瑞典语', '塔吉克语', '泰米尔语', '泰卢固语', '泰国语', '土耳其语', '乌克兰语', '乌尔都语',
                 '乌兹别克语', '越南语', '威尔士语', '科萨语', '意第绪语',
                 '约鲁巴语', '祖鲁语', '菲律宾语', '希伯来语']

if __name__ == "__main__":
    pass
